home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995…tember: Reference Library / Dev.CD Sep 95 RL / Dev.CD Sep 95 RL.toast / mac / Technical Documentation / develop / develop Issue 20 code / Pict Tricks / Batch CLUTLess / Shell Files / events.c next >
Encoding:
Text File  |  1994-10-14  |  6.8 KB  |  340 lines  |  [TEXT/MMCC]

  1. //---------------------------------------------------------------------
  2. //---------------------------------------------------------------------
  3. //
  4. //    Horrible Rickety Shell, by Dave Johnson
  5. //
  6. //    © Copyright 1985 - 1994 Anyone Who Wants It,
  7. //    All Rights Energetically Heaved as far away from me as possible.
  8. //    Use at your own (considerable) risk.
  9.  
  10.  
  11. #include    "Shell.h"
  12. #include    "ImageCompression.h"
  13.  
  14. extern Boolean            gDoneFlag;
  15. extern Rect                gDeskRect;
  16. extern MenuHandle        gShellMenuHandles[];
  17. extern long                gClickTime;
  18.  
  19. /*-------------------------------------------------------------------------
  20. DoEvent()            Standard Event Handler...
  21. -------------------------------------------------------------------------*/
  22.  
  23. void DoEvent(EventRecord *Event)
  24. {
  25.     GrafPtr        oldport;
  26.     
  27.     // Allow app to handle raw event
  28.     if(AppDoEvent(Event) == true)
  29.         return;
  30.     
  31.     // Do standard event processing    
  32.     switch(Event->what)
  33.     {
  34.         case activateEvt:
  35.             AppActivate((WindowPtr)Event->message, Event->modifiers & activeFlag);
  36.             break;
  37.                 
  38.         case updateEvt:
  39.             GetPort(&oldport);
  40.             SetPort((WindowPtr)Event->message);
  41.             BeginUpdate((WindowPtr)Event->message);
  42.             
  43.             AppUpdate(Event);
  44.             
  45.             EndUpdate((WindowPtr)Event->message);
  46.             SetPort(oldport);
  47.             break;
  48.  
  49.         case mouseDown:
  50.             DoMouse(Event);
  51.             gClickTime = Event->when;
  52.             break;
  53.             
  54.         case keyDown:
  55.             DoKey(Event);
  56.             break;
  57.         
  58.         case osEvt:
  59.             DoOS(Event);
  60.             break;
  61.         
  62.         case kHighLevelEvent:
  63.             DoHighLevel(Event);
  64.             break;
  65.         
  66.         case nullEvent:
  67.             AppIdle(Event);
  68.             break;
  69.     }
  70. }
  71.  
  72.  
  73. /*------------------------------------------------------------------------
  74. DoMouse()            Handles mousedown events...
  75. -------------------------------------------------------------------------*/
  76.  
  77. void DoMouse(EventRecord *eventptr)
  78. {    
  79.     WindowPtr        whichWindptr;
  80.     Point            thePt;
  81.     long            mstuff;
  82.     short            part;
  83.     Boolean            doubleClick = false;
  84.  
  85.     
  86.     if((eventptr->when - gClickTime) <= GetDblTime())
  87.     {
  88.         doubleClick = true;
  89.     }
  90.     thePt = eventptr->where;
  91.     part = FindWindow(thePt, &whichWindptr);
  92.     switch(part)
  93.     {
  94.         case inDesk:
  95.             break;
  96.             
  97.         case inMenuBar:
  98.             AppAdjustMenus();
  99.             mstuff = MenuSelect(thePt);
  100.             DoMenus(mstuff);
  101.             break;
  102.             
  103.         case inSysWindow:
  104.             SystemClick(eventptr, whichWindptr);
  105.             break;
  106.         
  107.         case inContent:
  108.             if(whichWindptr != FrontWindow())
  109.                 SelectWindow(whichWindptr);
  110.             else
  111.             {
  112.                 SetPort(whichWindptr);
  113.                 GlobalToLocal(&thePt);
  114.                 AppClick(thePt, whichWindptr, doubleClick);
  115.             }
  116.             break;
  117.             
  118.         case inDrag:
  119.             DragAlignedWindow(whichWindptr, thePt, &gDeskRect, nil, nil);
  120.             break;
  121.  
  122.         case inGrow:
  123.             AppGrowWindow(whichWindptr, thePt, &gDeskRect);
  124.             break;
  125.             
  126.         case inGoAway:
  127.             if(TrackGoAway(whichWindptr, thePt))
  128.             {
  129.                 AppClose();
  130.             }
  131.             break;
  132.             
  133.         case inZoomIn:
  134.         case inZoomOut:
  135.             if(TrackBox(whichWindptr, thePt, part))
  136.                 AppZoomWindow(whichWindptr, part);
  137.             break;
  138.     }
  139. }
  140.  
  141.  
  142. /*-----------------------------------------------------------------------
  143. DoKey()            Handles keypresses...
  144. ------------------------------------------------------------------------*/
  145.  
  146. void DoKey(EventRecord *eventptr)
  147. {
  148.     char    key;
  149.     
  150.     key = (char)(eventptr->message);
  151.     if(eventptr->modifiers & cmdKey)
  152.     {
  153.         AppAdjustMenus();
  154.         DoMenus(MenuKey(key));
  155.     }
  156. }
  157.     
  158. /*-----------------------------------------------------------------------
  159. DoOS()    Handles suspend and resume events, ignores mouse moved events
  160. ------------------------------------------------------------------------*/
  161.  
  162. void DoOS(EventRecord *eventPtr)
  163. {
  164.     /* Get the high byte of the message. Inside Mac VI says it's the low byte, but
  165.     then goes on to say bits 24-31. Must be a typo... */
  166.     switch ((eventPtr->message >> 24) & 0x0FF) /* the logical AND is a safety measure,
  167.                                                 to kill any sign bits shifted in */
  168.     {
  169.         case suspendResumeMessage:
  170.             /* Suspend/resume is also an activate/deactivate. */
  171.             AppActivate(FrontWindow(), eventPtr->message & resumeFlag);
  172.             break;
  173.  
  174.         case mouseMovedMessage:
  175.             break;
  176.     }
  177. }
  178.     
  179.  
  180. /*-----------------------------------------------------------------------
  181. DoHighLevel()    Handles  high level events (including Apple Events)
  182. ------------------------------------------------------------------------*/
  183.  
  184. void DoHighLevel(EventRecord *eventPtr)
  185. {
  186.     OSErr        err;
  187.     
  188.     // Assume it's an Apple Event, since we don't define any others
  189.     err = AEProcessAppleEvent(eventPtr);
  190.     if(err != noErr)
  191.         SysBeep(10);
  192. }
  193.     
  194.  
  195. /*-----------------------------------------------------------------------
  196. DoMenus()            Handles a menu selection...
  197. ------------------------------------------------------------------------*/
  198.  
  199. void DoMenus(long mstuff)
  200. {
  201.     short            id, item;
  202.     
  203.     if(HiWord(mstuff) == 0)
  204.         return;
  205.  
  206.     id = HiWord(mstuff);
  207.     item = LoWord(mstuff);
  208.     switch(id)
  209.     {
  210.         case kAppleMenuID:
  211.             DoApple(item);
  212.             break;
  213.             
  214.         case kFileMenuID:
  215.             DoFile(item);
  216.             break;
  217.  
  218.         case kEditMenuID:
  219.             DoEdit(item);
  220.             break;
  221.  
  222.         default:
  223.             AppMenu(id, item);
  224.             break;
  225.     }
  226.     HiliteMenu(0);
  227. }
  228.  
  229. /*-----------------------------------------------------------------------
  230. DoApple()            Handles apple menu...
  231. ------------------------------------------------------------------------*/
  232.  
  233. void DoApple(short item)
  234. {
  235.     Str255                name;
  236.  
  237.     switch(item)
  238.     {
  239.         case iAbout:
  240.             Alert(kAboutAlertID, nil);
  241.             break;
  242.         
  243.         default:
  244.             GetItem(gShellMenuHandles[kAppleMenu], item, name);
  245.             OpenDeskAcc(name);
  246.     }
  247. }
  248.             
  249. /*-----------------------------------------------------------------------
  250. DoFile()            Handles File menu...
  251. ------------------------------------------------------------------------*/
  252.     
  253. void DoFile(short item)
  254. {
  255.     switch(item)
  256.     {
  257.         
  258.  
  259.         case iNew:        /* New... */
  260.             AppNew();
  261.             break;
  262.                         
  263.         case iOpen:   /* Open...  */
  264.             AppOpen();
  265.             break;
  266.  
  267.         case iClose:   /* Close...  */
  268.             AppClose();
  269.             break;
  270.  
  271.         case iSave:  /* Save... */
  272.             AppSave();
  273.             break;
  274.             
  275.         case iSaveAs:  /* Save As... */
  276.             AppSaveAs();
  277.             break;
  278.             
  279.         case iPageSetup:  /* Page Setup... */
  280.             AppPageSetup();
  281.             break;
  282.             
  283.         case iPrint:  /* Print... */
  284.             AppPrint();
  285.             break;
  286.             
  287.         case iQuit:  /* Quit */
  288.             gDoneFlag = AppQuit();
  289.             break;
  290.     }
  291. }
  292.  
  293. /*-----------------------------------------------------------------------
  294. void DoEdit()            Handles Edit menu...
  295. ------------------------------------------------------------------------*/
  296.     
  297. void DoEdit(short item)
  298. {
  299.     /* First call SystemEdit to let a DA do editing, if one is frontmost. We
  300.         pass it the item - 1 since the constants for the edit commands are zero-based */
  301.     if(SystemEdit(item - 1) == false)
  302.     {
  303.         /* The command is for the app since SystemEdit didn't handle it. */
  304.         switch(item)
  305.         {
  306.             case iUndo:
  307.                 AppUndo();
  308.                 break;
  309.     
  310.             case iCut:
  311.                 AppCut();
  312.                 break;
  313.                 
  314.             case iCopy:
  315.                 AppCopy();
  316.                 break;
  317.     
  318.             case iPaste:
  319.                 AppPaste();
  320.                 break;
  321.     
  322.             case iClear:
  323.                 AppClear();
  324.                 break;
  325.         }
  326.     }
  327. }
  328.  
  329.  
  330.  
  331. /*---------------------------------
  332. void BailOut()        Clean up and split...
  333. ----------------------------------- */
  334.  
  335. void BailOut(void)
  336. {
  337.     AppCleanUp();
  338.     ExitToShell();
  339. }
  340.